home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / asm / prnwatch.asm < prev    next >
Assembly Source File  |  1993-07-09  |  4KB  |  112 lines

  1. ;*********************************************************************    
  2. ;
  3. ;PRNWATCH - Printer Watch
  4. ;  this tsr program "monitors" all printer activity via INT 17h
  5. ;
  6. ;*********************************************************************    
  7.  
  8.     DOSSEG
  9.     .MODEL  LARGE
  10.     .STACK 2000d
  11.     .DATA
  12.  
  13. pspseg  DW      0
  14. prev    DB      0
  15.  
  16.     .CODE
  17.  
  18. old17   dd      0
  19.  
  20. ;=====================================================================
  21. tsr     PROC    FAR
  22.     push ds                         ;save all registers
  23.     push es                         ;save all registers
  24.     push ax                         ;save all registers
  25.     push cx                         ;save all registers
  26.     push dx                         ;save all registers
  27.     push bx                         ;save all registers
  28.     push sp                         ;save all registers
  29.     push bp                         ;save all registers
  30.     push si                         ;save all registers
  31.     push di                         ;save all registers
  32.  
  33.     cmp al,13d                      ;is the char a CR?
  34.     je OK                           ;yes, go print it
  35.  
  36.     cmp al,10d                      ;is the char a LF?
  37.     je OK                           ;yes, go print it
  38.  
  39.     cmp al,27d                      ;is the char an ESC?
  40.     je OK                           ;yes, go print it
  41.  
  42.     cmp al,09d                      ;is the char a TAB?
  43.     jne LowAscii                    ;no, skip next section
  44.     
  45.     mov cx,3                        ;convert 1 tab to 3 spaces
  46.  
  47. ConvertTab:
  48.     mov ah,0Eh                      ;function to write teletype mode
  49.     mov al,20h                      ;write a space char
  50.     mov bh,0                        ;write it on page 0
  51.     int 10h                         ;call BIOS to do it
  52.     loop ConvertTab                 ;do it 3 times
  53.  
  54. LowAscii:
  55.     cmp al,20h                      ;is the char a SPACE or higher?
  56.     jb Done                         ;no, it's below - ignore it
  57.  
  58. OK:                                     ;if we get here, we're printing
  59.     mov dx,DGROUP                   ;get previous program's DGROUP
  60.     mov ds,dx                       ;put it in ds
  61.     mov ah,0Eh                      ;function to write teletype mode
  62.     mov bh,0                        ;write it on page 0
  63.     int 10h                         ;call BIOS to do it
  64.  
  65. Done:        
  66.     pop di                          ;restore register
  67.     pop si                          ;restore register
  68.     pop bp                          ;restore register
  69.     pop sp                          ;restore register
  70.     pop bx                          ;restore register
  71.     pop dx                          ;restore register
  72.     pop cx                          ;restore register
  73.     pop ax                          ;restore register
  74.     pop es                          ;restore register
  75.     pop ds                          ;restore register
  76.     jmp old17                       ;jump back to previous program
  77. tsr     endp
  78. ;=====================================================================
  79.  
  80.  
  81.  
  82. ;=====================================================================
  83. ; First run of program starts HERE!
  84. ; Shift TSR procedure to TSR memory
  85. ;
  86. start:  
  87.     mov     ax,DGROUP               ;set DGROUP for storage of resident code
  88.     mov     ds,ax                   ;put it in ds
  89.     mov     ax,es                   ;
  90.     mov     pspseg,ax               ;set vector to point to TSR proc
  91.     mov     ax,3517H                ;set function to set vector to our int
  92.     int     21H                     ;call DOS to do it
  93.     mov     WORD PTR old17,bx       ;save segment of previous program
  94.     mov     WORD PTR old17+2,es     ;save offset of previous program
  95.     push    ds                      ;store current DS
  96.     lea     dx,tsr                  ;move address of start of TSR
  97.     mov     ax,cs                   ;routine to DX
  98.     mov     ds,ax                   ;
  99.     mov     ax,2517H                ;get address of interrupt
  100.     int     21H                     ;call DOS to do it
  101.     pop     ds                      ;restore data segment
  102.     mov     dx,ss                   ;
  103.     sub     dx,pspseg               ;get amount of memory of only TSR
  104.     mov     ax,3100H                ;routine so only it will be stored
  105.     int     21h                     ;shift to TSR
  106.     end     start                   ;end the program as a TSR
  107.  
  108.     .EXIT
  109. ;=====================================================================
  110.  
  111.     END
  112.